package pruebas;

import java.util.LinkedList;
import modelo.auto.*;
import modelo.escenario.*;
import modelo.excepciones.*;
import modelo.jugador.*;
import junit.framework.*;

//ver (falta terminar Calculador)

public class TestCalculador extends TestCase {
	//constantes
	private Auto auto1 = new Auto();
	private Auto auto2 = new Auto();
	//private Calculador calculador;
	private LinkedList<Jugador> listaPlayers = new LinkedList <Jugador>() ;
	private LinkedList<Pista> Pistas = new LinkedList<Pista>();
	
	protected void setUp() throws Exception {
		
		//calculador = new Calculador();

	}

	protected void tearDown() throws Exception {
		super.tearDown();
	}

	public void testCalcularGanador() {
		int ganador=0;
		int clima=0; //0 = soleado
		Superficie sup = new Superficie();
		
		Jugador jugador1 = new Jugador();
		Jugador jugador2 = new Jugador();
		
		/*Le agrego un mejor combustible al auto 1 para que sea mas rapido que el 2*/
		Caja gearbox = new Caja("Automatica", "Caja", 0, 150, 1.5, 1.5, 100, 0, 6); 
		try {
			auto1.agregarComponente(gearbox);
		} catch (UnableToAddElementToListException e1) {
			fail("No se pudo agregar");
		} catch (InvalidMaxMarchaCajaException e1) {
			/*esta excepcion no tiene sentido para algo que no sea una caja*/
			fail("Marcha invalida");
		}
		
		jugador1.setAuto(auto1);
		jugador2.setAuto(auto2);
		
		listaPlayers.add(jugador1);
		listaPlayers.add(jugador2);
		
		sup.setTipo(2);
		Pista pista = new Pista(1000, sup);
		
		try {
			ganador = Calculador.calcularGanador(listaPlayers, pista, clima);
		} catch (NoSuchPlayersException e) {
			fail("No hay jugadores en la lista");
		} catch (GameMatchException e){
			fail("Empate!");
		}
		
		assertEquals(0, ganador);
		/*indica que gana el 1 (subindice 0 de la lista)*/
	}

	public void testCalcularRozamiento() {
		Superficie sup = new Superficie();
		
		sup.setTipo(1);
		double result = Calculador.calcularRozamiento(0, sup);
		assertEquals(2.5, result);
		
		/*--------------SEGUNDO TEST-------------*/
		
		sup.setTipo(0);
		result = Calculador.calcularRozamiento(1, sup);
		assertEquals(3.0, result);
		
		/*--------------TERCER TEST-------------*/
		
		sup.setTipo(2);
		result = Calculador.calcularRozamiento(1, sup);
		assertEquals(5.0, result);
	}

	public void testGenerarComputerPlayers() {
		Calculador.generarComputerPlayers(10, listaPlayers);
		assertEquals(10, listaPlayers.size());
		
		/*--------------SEGUNDO TEST-------------*/
		
		assertEquals(true, listaPlayers.get(1) instanceof Jugador);  /*Si el elem 1 es un jugador*/
	}

	public void testElegirPista() {
		Superficie sup1 = new Superficie();
		Superficie sup2 = new Superficie();
		
		sup1.setTipo(1);
		Pista pista1 = new Pista(10000, sup1);
		sup2.setTipo(2);
		Pista pista2 = new Pista(1599, sup2);
		Pista pista3 = null;
		
		Pistas.add(pista1);
		pista3 = Calculador.elegirPista(Pistas);
		
		assertNotNull(pista3);  /*Verifico que modifique el valor de pista3*/
		
		/*--------------SEGUNDO TEST-------------*/
		
		assertEquals(pista1, pista3);  /*Verifica que me de la unica pista que hay en la lista*/
		
		/*--------------TERCER TEST----------------*/
		
		Pistas.add(pista2);
		pista3 = Calculador.elegirPista(Pistas);
		
		assertEquals(true, pista3 instanceof Pista);  /*Verifico que sea instancia de pista*/
	}

	/*public void testCalcularSuerficie() {
		int superf = Calculador.calcularSuerficie();
		Superficie sup = new Superficie();
		
		sup.setTipo(superf);
		
		System.out.println("La sup es = "+sup.getTipo()); ///
	}*/

/*
	public void testElegirClima() {
		//No pueden probarse con las herramientas de Junit
		//ya que hay un rango de valores posibles
	}
*/
}
